// 封装转化树形数据的方法

// 明确封装的方法的入参和返回值
// 1. 入参：要转换的扁平化数组数据
// 2. 返回值：转换后的树形结构数组数据

// 转换思路
// 遍历扁平化数组，如果遍历的当前项的 pid 和某一项的 id 相等，那么说明 当前项 就是 某一项的 子节点，把当前项放到某一项的 children 属性中。

// [1, 2, 3, 4, 5, 6]

function transTree(list) {
  // list 入参：要转换的扁平化数组数据

  // 转换后的树形结构数组数据
  const treeList = []

  // 为了方便找 id，我们创建一个 id 和 item 的映射关系
  const map = {}
  list.forEach(item => {
    map[item.id] = item
  })
  // list 扁平化数据
  // list = [
  //   {
  //     code: "1",
  //     createTime: "2022-07-18 08:34:33",
  //     id: "604e115c7bfcfa45d019d3e9",
  //     introduce: "程序员的摇篮",
  //     name: "传智教育",
  //     pid: "-1"
  //   },
  //   {
  //     code: "XZ",
  //     createTime: "2021-03-14 22:47:25",
  //     id: "604e222bb205b95968e1312a",
  //     introduce: "行政部",
  //     manager: "管理员",
  //     name: "行政部",
  //     pid: ""
  //   }
  // ]
  // map：id 和 item 的映射关系
  // map = {
  //   "604e115c7bfcfa45d019d3e9": {
  //     code: "1",
  //     createTime: "2022-07-18 08:34:33",
  //     id: "604e115c7bfcfa45d019d3e9",
  //     introduce: "程序员的摇篮",
  //     name: "传智教育",
  //     pid: "-1"
  //   },
  //   "604e222bb205b95968e1312a": {
  //     code: "XZ",
  //     createTime: "2021-03-14 22:47:25",
  //     id: "604e222bb205b95968e1312a",
  //     introduce: "行政部",
  //     manager: "管理员",
  //     name: "行政部",
  //     pid: "",
          children: [{},{},{}]
  //   }
  // }
  console.log(map)
  list.forEach(item => {
    // debugger
    if (map[item.pid]) {
      // map[item.pid] 就是当前项的父节点
      // 代表找到了父节点
      // 就将当前项 放到父亲节点的 children 属性中
      // 如果父节点没有 children 属性，就创建一个 children 为空数组
      if (!map[item.pid].children) map[item.pid].children = []
      map[item.pid].children.push(item)
    } else {
      // 没有找打父节点，代表它是顶级节点，直接放到转换后的树形结构数组数据
      treeList.push(item)
    }
  })

  // 返回值：转换后的树形结构数组数据
  return treeList
}


function recurTransTree(list, id) {
  // 入参：
  // 1. list ：扁平化数组数据
  // 2. id：每次找孩子的父亲节点的 id

  // 创建一个收集本次递归的父节点的孩子数组
  const treeList = []
  // 遍历扁平化数组
  list.forEach(item => {
    // 如果当前项的 pid 等于本次递归的 父亲节点
    if (item.pid === id) { // (递归终止条件)
      // 就将它放入孩子数组里面
      treeList.push(item) // (处理当前层)
      // 以当前节点的 id 作为父节点，再次递归找他的孩子
      const children = recurTransTree(list, item.id) // (下钻到下一层)
      if (children.length) item.children = children
    }
  })
  // 返回孩子数组
  return treeList
}

export default recurTransTree
